/**
 * 常量定义模块
 *
 * 包含游戏中所有的枚举类型、配置数据和工具函数
 */

// 常量定义
export const ROUND_LIMIT = 200;            // 回合数上限
export const COMMAND_FAIL_LIMIT = 50;     // 命令失败次数上限
export const INIT_RMB = 200;              // 玩家初始经济
export const SPLASH_DAMAGE_RATIO = 0.5;  // 溅射伤害比例

// 枚举定义
export enum UnitType {
    soldier = 0,    // 士兵
    collect = 1,    // 采集兵
    doctor = 2,     // 治疗兵
    archer = 3,     // 弓箭手
    worker = 4      // 建造兵
}

export enum TildeType {
    flat = 0,     // 平地
    hill = 1,     // 山丘
    river = 2,    // 河流
    gold = 11,    // 黄金矿
    energy = 12,  // 能源矿
    wood = 13,    // 木材
    stone = 14    // 石材
}

export enum BuildingType {
    base = 0,   // 基地
    tower = 1,  // 防御塔
    wall = 2    // 城墙
}

export enum EntityType {
    unit = 0,     // 单位
    building = 1, // 建筑
    terrain = 2   // 地形
}

export const DirectionType = {
    up: [0, -1] as [number, number],     // 向上
    down: [0, 1] as [number, number],    // 向下
    left: [-1, 0] as [number, number],   // 向左
    right: [1, 0] as [number, number]    // 向右
} as const;

export enum CommandType {
    init = "init",       // 初始化战场
    end = "end",         // 结束
    move = "move",       // 移动
    attack = "attack",   // 攻击
    build = "build",     // 建造
    swap = "swap",       // 生产
    heal = "heal",       // 治疗
    collect = "collect"  // 采集
}

export enum PlayerType {
    PLAYER1 = "player1",  // 玩家1
    PLAYER2 = "player2",  // 玩家2
    ADMIN = "admin"       // 管理员
}

// 接口定义
interface UnitConfig {
    name: string;          // 名字
    attack: number;        // 攻击力
    speed: number;         // 移动速度
    hp: number;            // 初始血量
    attackRange: number;   // 攻击范围
    cost: number;          // 生产成本
    killedAward: number;   // 被击杀奖励
    icon: string;          // 文本小图标
}

interface ResourceConfig {
    name: string;          // 名字
    value: number;         // 价值
    icon: string;          // 文本小图标
}

interface BuildingConfig {
    name: string;          // 名字
    attack: number;        // 攻击力
    hp: number;            // 初始血量
    attackRange: number;   // 攻击范围
    cost: number;          // 建造成本
    killedAward: number;   // 被击杀奖励
    icon: string;          // 文本小图标
}

// 单位配置
export const UNIT_CONFIG: Record<UnitType, UnitConfig> = {
    [UnitType.soldier]: {
        name: "士兵", // 名字
        attack: 30, // 攻击力
        speed: 1, // 移动速度
        hp: 80, // 初始血量
        attackRange: 1, // 攻击范围
        cost: 25, // 生产成本
        killedAward: 15, // 被击杀奖励
        icon: "⚔️", // 文本小图标
    },
    [UnitType.collect]: {
        name: "采集兵", // 名字
        attack: 1, // 采集数量
        speed: 1, // 移动速度
        hp: 40, // 初始血量
        attackRange: 1, // 采集范围
        cost: 15, // 生产成本
        killedAward: 15, // 被击杀奖励
        icon: "⛏️", // 文本小图标
    },
    [UnitType.doctor]: {
        name: "治疗兵", // 名字
        attack: 10, // 治疗量
        speed: 1, // 移动速度
        hp: 50, // 初始血量
        attackRange: 1, // 治疗范围
        cost: 20, // 生产成本
        killedAward: 12, // 被击杀奖励
        icon: "💊", // 文本小图标
    },
    [UnitType.archer]: {
        name: "弓箭手", // 名字
        attack: 20, // 攻击力
        speed: 1, // 移动速度
        hp: 40, // 初始血量
        attackRange: 3, // 攻击范围
        cost: 30, // 生产成本
        killedAward: 18, // 被击杀奖励
        icon: "🏹", // 文本小图标
    },
    [UnitType.worker]: {
        name: "建造兵", // 名字
        attack: 1, // 建筑数量
        speed: 1, // 移动速度
        hp: 50, // 初始血量
        attackRange: 1, // 建造范围
        cost: 30, // 生产成本
        killedAward: 18, // 被击杀奖励
        icon: "🪓", // 文本小图标
    },
};

// 资源配置
export const RESOURCE_CONFIG: Record<TildeType, ResourceConfig> = {
    [TildeType.energy]: {
        name: "能源", // 名字
        value: 3, // 价值
        icon: "⚡", // 文本小图标
    },
    [TildeType.wood]: {
        name: "木材", // 名字
        value: 2, // 价值
        icon: "🌲", // 文本小图标
    },
    [TildeType.stone]: {
        name: "石材", // 名字
        value: 2, // 价值
        icon: "🧱", // 文本小图标
    },
    [TildeType.gold]: {
        name: "黄金", // 名字
        value: 6, // 价值
        icon: "💰", // 文本小图标
    },
} as any;

// 建筑配置
export const BUILDING_CONFIG: Record<BuildingType, BuildingConfig> = {
    [BuildingType.base]: {
        name: "基地", // 名字
        attack: 1, // 攻击力
        hp: 600, // 初始血量
        attackRange: 10, // 攻击范围
        cost: 0, // 建造成本
        killedAward: 0, // 被击杀奖励
        icon: "🕍", // 文本小图标
    },
    [BuildingType.tower]: {
        name: "防御塔", // 名字
        attack: 30, // 攻击力
        hp: 50, // 初始血量
        attackRange: 4, // 攻击范围
        cost: 100, // 建造成本
        killedAward: 100, // 被击杀奖励
        icon: "🗼", // 文本小图标
    },
    [BuildingType.wall]: {
        name: "城墙", // 名字
        attack: 0, // 攻击力
        hp: 150, // 初始血量
        attackRange: 0, // 攻击范围
        cost: 200000, // 建造成本
        killedAward: 6, // 被击杀奖励
        icon: "🌆", // 文本小图标
    },
};

// 工具函数
export function getUnitConfig(unitType: UnitType): UnitConfig {
    return UNIT_CONFIG[unitType];
}

export function getBuildingConfig(buildingType: BuildingType): BuildingConfig {
    return BUILDING_CONFIG[buildingType];
}

export function getResourceConfig(resourceType: TildeType): ResourceConfig {
    return RESOURCE_CONFIG[resourceType];
}

export function isResourceTildeType(tildeType: TildeType): boolean {
    return (
        tildeType === TildeType.gold ||
        tildeType === TildeType.energy ||
        tildeType === TildeType.wood ||
        tildeType === TildeType.stone
    );
}

// 接口导出
export interface Position {
    x: number;
    y: number;
}

export interface Unit {
    id: number;
    type: UnitType;
    playerId: number;
    x: number;
    y: number;
    health: number;
    maxHealth: number;
}

export interface Building {
    id: number;
    type: BuildingType;
    playerId: number;
    x: number;
    y: number;
    health: number;
    maxHealth: number;
}

export interface Tile {
    type: TildeType;
    x?: number;
    y?: number;
}

export interface GameMap {
    width: number;
    height: number;
    terrain?: Tile[][];
    tiles?: Tile[];
}